One more small problem I noticed: if you proc iAoTH/cast Rapid Fire, the swing bar will start updating immediately for the new speed because it's always calculating swingTime from UnitRangedDamage(), but the haste doesn't actually boost your swing timer until your next auto shot, making this inaccurate. An easy way to fix this is to create a global wepSpeed variable that only updates for UnitRangedDamage() just as you call Swing_Start() and then calculate your swingTime from that.
As for the other problems, perhaps you could check for spell cooldowns to see whether Aimed Shot, Multi-Shot etc. was just cast? Just a suggestion, I'm not sure if there's a better method.